# 1. 实现菜单函数，输出下列信息，返回用户输入的编号，并进行输入校验。
def menu():
    print("*" * 40)
    print("*            学生管理系统                 *")
    print("*            1. 添加新学生信息            *")
    print("*            2. 通过学号修改学生信息       *")
    print("*            3. 通过学号删除学生信息       *")
    print("*            4. 通过姓名删除学生信息       *")
    print("*            5. 通过学号查询学生信息       *")
    print("*            6. 通过姓名查询学生信息       *")
    print("*            7. 显示所有学生信息           *")
    print("*            8. 退出系统                  *")
    print("*" * 40)

    select_op = int(input("输入编号选择操作："))

    if 1 <= select_op <= 8:
        return select_op
    else:
        print("输入错误，请输入整数1-8")

# 2. 实现控制函数，用来控制菜单的输出与功能的选择，直到用户选择8，结束程序运行。
def sc(select_op):
    if select_op == 1:
        print("1. 添加新学生信息")
    elif select_op == 2:
        print("2. 通过学号修改学生信息")
    elif select_op == 3:
        print("3. 通过学号删除学生信息")
    elif select_op == 4:
        print("4. 通过姓名删除学生信息")
    elif select_op == 5:
        print("5. 通过学号查询学生信息")
    elif select_op == 6:
        print("6. 通过姓名查询学生信息")
    elif select_op == 7:
        print("7. 显示所有学生信息")
    elif select_op == 8:
        print("8. 退出系统 ")
def control():
    while True:
        choice = menu()
        sc(choice)
        if choice == 8:
            break
# control()
# 3. 实现添加学生函数，函数参数为编号，姓名，年龄，性别四个参数，返回是否添加成功的结果，要求编号不可重复。
# 用列表存储所有学生信息，每个元素是一个字典
students = []
def add_student(bh, xm, nl, xb):
    for student in students:
        if student['bh'] == bh:
            return "学生信息添加失败"
    new_student = {
        'bh': bh,
        'xm': xm,
        'nl': nl,
        'xb': xb
    }
    students.append(new_student)
    return "学生信息添加成功"
print(add_student(1001, "张三", 20, "男"))
print(add_student(1001, "李四", 19, "女"))
for s in students:
     print(s)
# 4. 实现修改函数，参数为学号，如果学生存在，则进行修改，不存在输出提示，并返回是否修改成功
# 假设已存在存储学生信息的列表（与添加函数共用）
# 假设已存在存储学生信息的列表（与添加函数共用）
def modify_student(bh):
    for student in students:
        if student['bh'] == bh:
            print(f"学号为{bh}的学生存在，信息为：{student}，请修改后点击回车按钮")
            new_xm = input("请输入新姓名：")
            new_nl = int(input("请输入新年龄："))
            new_xb = input("请输入新性别：")
            if new_xm:
                student['xm'] = new_xm
            if new_nl:
                student['nl'] = new_nl
            if new_xb:
                student['xb'] = new_xb
            print(f"修改后信息：{student}")
            return "学生信息修改成功"
    print(f"学号为{bh}的学生不存在！")
    return "学生信息修改失败"
print(modify_student(1001))
print(modify_student(9999))
# 5. 实现删除函数，参数为学号，如果学生存在，则进行删除，不存在输出提示，并返回是否删除成功
def delete_by_id(bh):
    # 遍历列表查找学号（用索引遍历，方便删除）
    for i in range(len(students)):
        if students[i]['bh'] == bh:
            deleted_stu = students.pop(i)  # 删除对应索引的学生
            print(f"已删除学号为{bh}的学生信息：{deleted_stu}")
            return "学生信息删除成功"
    # 未找到学号
    print(f"学号为{bh}的学生不存在！")
    return "学生信息删除失败"
# 6. 实现删除函数，参数为姓名，如果学生存在，则进行删除（同名学生全部删除），
# 不存在输出提示，并返回是否删除成功
def delete_by_name(xm):
    # 先收集所有同名学生的索引（避免删除时列表长度变化导致漏删）
    same_name_indices = []
    for i in range(len(students)):
        if students[i]['xm'] == xm:
            same_name_indices.append(i)

    # 判断是否有同名学生
    if not same_name_indices:
        print(f"姓名为{xm}的学生不存在！")
        return "学生信息删除失败"

    # 倒序删除（避免索引偏移）
    deleted_count = 0
    for idx in reversed(same_name_indices):
        deleted_stu = students.pop(idx)
        print(f"已删除学生信息：{deleted_stu}")
        deleted_count += 1

    return f"学生信息删除成功（共删除{deleted_count}名同名学生）"
# 7. 实现查询函数，参数为学号，如果学生存在，则输出学生信息，不存在输出提示，并返回是否查询成功
def query_by_id(bh):
    for student in students:
        if student['bh'] == bh:
            print(f"查询到学号为{bh}的学生信息：")
            print(f"学号：{student['bh']}，姓名：{student['xm']}，年龄：{student['nl']}，性别：{student['xb']}")
            return "学生信息查询成功"
    # 未找到学号
    print(f"学号为{bh}的学生不存在！")
    return "学生信息查询失败"
# 8. 实现查询函数，参数为姓名，如果学生存在，则输出学生信息（同名学生全部输出），
# 不存在输出提示，并返回是否删除成功
def query_by_name(xm):
    # 收集所有同名学生
    same_name_students = []
    for student in students:
        if student['xm'] == xm:
            same_name_students.append(student)

    # 判断是否有结果
    if not same_name_students:
        print(f"姓名为{xm}的学生不存在！")
        return "学生信息查询失败"

    # 输出所有同名学生信息
    print(f"查询到{len(same_name_students)}名姓名为{xm}的学生信息：")
    for i, stu in enumerate(same_name_students, 1):
        print(f"{i}. 学号：{stu['bh']}，姓名：{stu['xm']}，年龄：{stu['nl']}，性别：{stu['xb']}")

    return "学生信息查询成功"
# 9. 实现函数，输出所有学生信息
def show_all_students():
    if not students:
        print("当前无任何学生信息！")
        return
    # 输出所有学生（格式化显示，更清晰）
    print("=" * 50)
    print("当前所有学生信息：")
    print(f"{'序号':<4}{'学号':<8}{'姓名':<8}{'年龄':<6}{'性别':<4}")
    print("-" * 50)
    for i, stu in enumerate(students, 1):
        print(f"{i:<4}{stu['bh']:<8}{stu['xm']:<8}{stu['nl']:<6}{stu['xb']:<4}")
    print("=" * 50)

# 程序入口：运行控制函数
if __name__ == "__main__":
    control()